﻿namespace StudentWeb.BLL
{
    /// <summary>
    /// 枚举：表示操作的结果码
    /// </summary>
    public enum ResultCode
    {
        Success = 0,  // 操作成功
        Fail = -1,    // 操作失败
    }

    /// <summary>
    /// 结果接口：定义结果的基本结构
    /// </summary>
    public interface IResult
    {
        /// <summary>
        /// 返回码，表示操作结果的状态
        /// </summary>
        int code { get; set; }

        /// <summary>
        /// 消息，通常用于提供操作的详细信息
        /// </summary>
        string? msg { get; set; }

        /// <summary>
        /// 数据，操作结果的数据部分
        /// </summary>
        object? data { get; set; }
    }

    /// <summary>
    /// 结果类：实现 IResult 接口，封装操作结果信息
    /// </summary>
    public class Result : IResult
    {
        public int code { get; set; }  // 操作结果码
        public string? msg { get; set; }  // 消息
        public object? data { get; set; }  // 数据

        /// <summary>
        /// 构造函数：初始化结果对象
        /// </summary>
        /// <param name="data">操作结果的数据</param>
        /// <param name="code">操作结果码，默认为成功</param>
        /// <param name="msg">操作结果的消息</param>
        public Result(object? data = null, ResultCode code = ResultCode.Success, string? msg = null)
        {
            this.code = (int)code;  // 将枚举值转换为 int 类型
            this.msg = msg;
            this.data = data;
        }

        /// <summary>
        /// 静态方法：返回操作成功的结果，并可附带消息和数据
        /// </summary>
        /// <param name="msg">成功的消息</param>
        /// <param name="data">操作成功时的附加数据（可选）</param>
        /// <returns>Result 对象，表示操作成功，并可能包含消息和数据</returns>
        public static Result OK(string? msg = null, object? data = null) { return new Result(data, ResultCode.Success, msg); }

        /// <summary>
        /// 静态方法：返回操作失败的结果
        /// </summary>
        /// <param name="msg">失败的消息</param>
        /// <returns>Result 对象，表示操作失败</returns>
        public static Result Fail(string? msg = null) { return new Result(null, ResultCode.Fail, msg); }

        /// <summary>
        /// 静态方法：根据布尔值判断操作是否成功
        /// </summary>
        /// <param name="isOK">操作是否成功</param>
        /// <returns>Result 对象，表示操作结果</returns>
        public static Result IsOK(bool isOK) { return new Result(null, isOK ? ResultCode.Success : ResultCode.Fail); }

        /// <summary>
        /// 静态方法：返回包含数据的结果
        /// </summary>
        /// <param name="data">操作结果的数据</param>
        /// <returns>Result 对象，表示操作结果</returns>
        public static Result Data(object? data) { return new Result(data, data != null ? ResultCode.Success : ResultCode.Fail); }
    }
}
